home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / util / shell / cfn.lha / cfn / cfn.e < prev    next >
Text File  |  1995-05-05  |  8KB  |  346 lines

  1. /* Window shuffle! */
  2. /* Tar det bakersta fönstret, aktiverar det och flyttar det längst fram när man
  3.    trycker rätt tangent (vänster amiga tab). */
  4. /* Implementerar också filename completion med tab */
  5. /* Tar första match, nästa tryckning tar nästa match osv.. */
  6. /* Kompilerar EJ med E v2.1b, words signextendas inte i den versionen */
  7. OPT STACK=$CDAB       /* Så att den känns igen med NewZap */
  8.               /* lagom storlek $0800 (2048) bytes */
  9. CONST FBUF=80
  10.  
  11. MODULE 'keymap'
  12. MODULE 'utility'
  13. MODULE 'exec/ports'
  14. MODULE 'exec/tasks'
  15. MODULE 'exec/types'
  16. MODULE 'exec/interrupts'
  17. MODULE 'exec/nodes'
  18. MODULE 'exec/io'
  19. MODULE 'exec/memory'
  20. MODULE 'intuition/screens'
  21. MODULE 'intuition/intuition'
  22. MODULE 'devices/input'
  23. MODULE 'devices/inputevent'
  24. MODULE 'dos/dos'
  25. MODULE 'dos/dosextens'
  26.  
  27. OBJECT memess /* från Notify */
  28.    mess     : mn
  29.    wind     : LONG
  30.    process    : LONG
  31. ENDOBJECT
  32. OBJECT toraw
  33.    cd        : CHAR
  34.    qu        : CHAR
  35. ENDOBJECT
  36.  
  37. DEF fib:PTR TO fileinfoblock /* global så att värdena sparas */
  38. DEF old_lock,path_lock,todel
  39. DEF glob_event:inputevent
  40. DEF bb[81]:ARRAY,bbp
  41. DEF lastproc:PTR TO process,lastwin,okwin,flag,
  42.     wins[10]:ARRAY OF LONG,procs[10]:ARRAY OF LONG
  43. DEF task:PTR TO tc
  44. DEF sig
  45. DEF bufw:PTR TO inputevent, buf[5]:ARRAY OF inputevent, bufr:PTR TO inputevent
  46. DEF bufend
  47. DEF port:PTR TO mp
  48. DEF io_req:PTR TO iostd
  49.  
  50. PROC main()
  51. DEF handler:is
  52. DEF lnpek:PTR TO ln,t,s
  53.     bufr:=buf; bufw:=buf; bufend:=5*SIZEOF inputevent + buf
  54.     FOR t:=0 TO 4 DO buf[t].class:=IECLASS_RAWKEY
  55.     IF (fib := New(SIZEOF fileinfoblock)) = 0 THEN CleanUp(20)
  56.     IF openlibs() THEN CleanUp(20)
  57.     sig:=Shl(1,(s:=AllocSignal(-1)))
  58.     task:=FindTask(NIL)
  59.     SetTaskPri(task,5)
  60.     IF (port:=CreateMsgPort())
  61.       lnpek:=port.ln
  62.       lnpek.name:='Shuffle'
  63.       AddPort(port)
  64.       IF (io_req:=CreateIORequest(port,SIZEOF iostd))
  65.     IF OpenDevice('input.device',0,io_req,0) = NIL
  66.       handler.code:={handeven}
  67.       MOVE.L A4,t
  68.       handler.data:=t
  69.       lnpek:=handler.ln
  70.       lnpek.pri:=51;  /* just before intuition */
  71.       lnpek.name:='Shuffle';
  72.       io_req.data:=handler;
  73.       io_req.command:=IND_ADDHANDLER;
  74.       DoIO(io_req);
  75.       serve_handler();  /* never returns... */
  76.       io_req.data:=handler;
  77.       io_req.command:=IND_REMHANDLER;
  78.       DoIO(io_req);
  79.       /*  ELSE
  80.       WriteF('No input.device') */
  81.     ENDIF
  82.     DeleteIORequest(io_req)
  83.     /*    ELSE
  84.     WriteF('No CreateIORequest') */
  85.       ENDIF
  86.       RemPort(port)
  87.       DeleteMsgPort(port)
  88.   /*  ELSE
  89.       WriteF('No CreateMsgPort') */
  90.     ENDIF
  91.     FreeSignal(s)
  92.     IF utilitybase THEN CloseLibrary(utilitybase)
  93.     IF keymapbase THEN CloseLibrary(keymapbase)
  94. ENDPROC
  95.  
  96. PROC observe_input()       /* Har hittat RawKey */
  97. DEF i
  98. IF Long(intuitionbase+52)<>lastwin /* bytt fönster */
  99.   bbp:=0
  100.   lastwin:=Long(intuitionbase+52)
  101.   i:=0
  102.   WHILE (i<10) AND (lastwin<>wins[i]) DO INC i
  103.   IF i<10
  104.     lastproc:=procs[i]
  105.     okwin:=TRUE
  106.   ELSE
  107.     lastproc:=NIL; okwin:=FALSE; flag := TRUE
  108.   ENDIF
  109. ENDIF
  110.  
  111.  
  112.  
  113. IF (glob_event.code = $42) AND (glob_event.qualifier = $ffff8040)  /* Amiga-TAB */
  114.   glob_event.class := IECLASS_NULL
  115.   MOVE.L bufw,A1
  116.   MOVE.L glob_event,A0
  117.   MOVE.L 6(A0),6(A1)
  118.   MOVE.L 10(A0),10(A1)
  119.   ADDI.L #SIZEOF inputevent,bufw
  120.   IF bufw=bufend THEN bufw:=buf
  121.   Signal(task,sig)
  122.   RETURN
  123. ENDIF
  124. IF okwin
  125.   IF glob_event.code = $42
  126.     glob_event.class := IECLASS_NULL
  127.     okwin:=FALSE   /* ta inte emot fler tecken innan sökningen färdig */
  128.   ENDIF
  129.   MOVE.L bufw,A1
  130.   MOVE.L glob_event,A0
  131.   MOVE.L 6(A0),6(A1)
  132.   MOVE.L 10(A0),10(A1)
  133.   ADDI.L #SIZEOF inputevent,bufw
  134.   IF bufw=bufend THEN bufw:=buf
  135.   Signal(task,sig)
  136.   RETURN
  137. ENDIF
  138.  
  139. RETURN
  140.  
  141. handeven:
  142. MOVE.L    A0,-(A7)          /* Spara pekare InputEvent */
  143. notrawkey:
  144. MOVE.L    A0,D0          /* Slut ? */
  145. BEQ.S    nomore
  146. CMPI.B     #IECLASS_RAWKEY,4(A0)   /* Bara RAWKEY intress. */
  147. BEQ.S    rawkey
  148. MOVE.L    (A0),A0                 /* Kolla nästa */
  149. BRA.S    notrawkey
  150.  
  151. rawkey:
  152. MOVEM.L D1-D7/A0-A6,-(A7)       /* Fixa register inför proc. */
  153. MOVE.L    A1,A4            /* ladda A4 */
  154. MOVE.L    A0,glob_event
  155. observe_input()                 /* E-funktion */
  156. MOVEM.L (A7)+,D1-D7/A0-A6       /* Hämta register */
  157. MOVE.L    (A0),A0
  158. BRA.S    notrawkey
  159.  
  160. nomore:
  161. MOVE.L    (A7)+,D0                /* Avsluta */
  162. RTS
  163. ENDPROC
  164.  
  165. PROC clearit()    /* ta bort gamla lock */
  166. IF old_lock
  167.   bbp := StrLen(bb)
  168.   CurrentDir(old_lock)
  169.   IF path_lock THEN UnLock(path_lock)
  170.   old_lock := NIL
  171. ENDIF
  172. flag := NIL
  173. ENDPROC
  174.  
  175.  
  176. PROC serve_handler()
  177. DEF lock,win1:PTR TO window,win2:PTR TO window,s:PTR TO screen,ms:PTR TO memess,t
  178. DEF t2
  179. bbp:=0
  180. LOOP
  181.   IF (Wait(Shl(1,port.sigbit)+sig+SIGBREAKF_CTRL_C) AND SIGBREAKF_CTRL_C) THEN RETURN
  182.   WHILE ms:=GetMsg(port)     /* Nytt fönster */
  183.     addwin(ms.wind,ms.process)
  184.     FreeMem(ms,SIZEOF memess)
  185.   ENDWHILE
  186.   WHILE bufr<>bufw
  187.     t:=bufr.code
  188.     t2 := ((t AND $7f) <> $42)
  189.     IF t2 OR flag
  190.       clearit()
  191.     ENDIF
  192.     SELECT t
  193.     CASE $42
  194.       IF bufr.qualifier=$ffff8040    /* Amiga-tab, skyffla fönster */
  195.     lock:=LockIBase(0)
  196.     win1:=Long(intuitionbase+52)
  197.     win2:=win1.nextwindow
  198.     IF win2 = NIL
  199.       s:=win1.wscreen
  200.       win2:=s.firstwindow
  201.     ENDIF
  202.  
  203.     IF (win1<>0) AND (win2<>0)
  204.       WindowToFront(win2)
  205.       ActivateWindow(win2)
  206.     ENDIF
  207.     UnlockIBase(lock)
  208.       ELSE        /* Här ska filnamnet kompletteras */
  209.     IF lastproc
  210.       todel := IF old_lock THEN StrLen(bb)-bbp ELSE 0
  211.       PutChar(bbp+bb,0)
  212.       IF old_lock
  213.         complete()
  214.       ELSE
  215.         old_lock:=CurrentDir(lastproc.currentdir)
  216.         t:=FilePart(bb)
  217.         t2:=Char(t)
  218.         PutChar(t,0)
  219.         IF (path_lock:=Lock(bb,ACCESS_READ))
  220.           PutChar(t,t2)
  221.           IF Examine(path_lock,fib)
  222.         complete()
  223.           ENDIF
  224.         ELSE
  225.           clearit()
  226.         ENDIF
  227.       ENDIF
  228.       feedit()
  229.       Delay(2)    /* Vänta på att inputströmmen är slut */
  230.       okwin:=TRUE
  231.     ENDIF
  232.       ENDIF
  233.     CASE $41            /* BS */
  234.       IF bbp>0 THEN DEC bbp
  235.     CASE $44            /* RETURN */
  236.       bbp:=0
  237.     CASE $4c            /* Arrow Up */
  238.       bbp:=0
  239.     CASE $4d            /* Arrow Down */
  240.       bbp:=0
  241.     CASE $4e            /* Arrow Right */
  242.       bbp:=0
  243.     CASE $4f            /* Arrow Left */
  244.       bbp:=0
  245.     CASE $40            /* Space */
  246.       bbp:=0
  247.     CASE $32            /* CTRL-x */
  248.       IF bufr.qualifier = $ffff8008
  249.     bbp:=0
  250.       ELSE
  251.     bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
  252.       ENDIF
  253.  
  254.     DEFAULT
  255.       bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
  256.       IF (bbp=1) AND ((Char(bb)="<") OR (Char(bb)=">")) THEN bbp:=0
  257.     ENDSELECT
  258.     bufr:=bufr+SIZEOF inputevent
  259.     IF bufr=bufend THEN bufr:=buf
  260.   ENDWHILE
  261.  
  262. ENDLOOP
  263. ENDPROC
  264.  
  265. PROC addwin(wind:PTR TO window,process)
  266. DEF lock,s:PTR TO screen,i=0,w:PTR TO window
  267.   lock:=LockIBase(0)
  268.   s:=wind.wscreen
  269.   w:=s.firstwindow
  270.   WHILE i<10 AND w<>NIL
  271.     IF wind=wins[i]
  272.       procs[i]:=process
  273.       i:=10
  274.     ENDIF
  275.     IF w=wins[i]
  276.       w:=s.firstwindow
  277.       i:=i+1
  278.     ELSE
  279.       w:=w.nextwindow
  280.     ENDIF
  281.   ENDWHILE
  282.   IF i<10
  283.     wins[i]:=wind
  284.     procs[i]:=process
  285.     lastwin:=NIL
  286.   ENDIF
  287.   UnlockIBase(lock)
  288. ENDPROC
  289.  
  290. PROC openlibs()
  291. IF (utilitybase:=OpenLibrary('utility.library',37))
  292.   IF ((keymapbase:=OpenLibrary('keymap.library',37))=NIL) THEN CloseLibrary(utilitybase)
  293. ENDIF
  294. RETURN (utilitybase=NIL)+(keymapbase=NIL)
  295. ENDPROC
  296.  
  297. PROC complete()
  298. DEF comset,t,fnam,flen
  299. fnam:=FilePart(bb); flen:=StrLen(fnam);
  300.   LowerStr(fnam)
  301.   REPEAT
  302.     t:=ExNext(path_lock,fib)
  303.     LowerStr(fib.filename)
  304.     IF fib.direntrytype>0 THEN copstr('/',fib.filename+StrLen(fib.filename))
  305.     comset := StrCmp(fnam,fib.filename,flen)
  306.   UNTIL (t=0) OR comset
  307.   IF t AND comset AND ((fnam-bb+StrLen(fib.filename)) < 80)
  308.     copstr(fib.filename,fnam)
  309.   ELSE
  310.     DisplayBeep(NIL)
  311.     clearit()
  312.   ENDIF
  313. ENDPROC
  314.  
  315. PROC copstr(str1,str2)
  316. MOVE.L    str1,A0
  317. MOVE.L    str2,A1
  318. copstr_l1:
  319. MOVE.B    (A0)+,(A1)+
  320. BNE.S copstr_l1
  321. ENDPROC
  322.  
  323. PROC feedit()
  324. DEF raw_char:toraw,iep:inputevent,i=0
  325. iep.nextevent:=NIL
  326. PutLong(iep+10,0)
  327. iep.class:=IECLASS_RAWKEY
  328. io_req.data:=iep
  329. io_req.length:=SIZEOF inputevent
  330. io_req.command:=IND_WRITEEVENT
  331. WHILE todel
  332.   DEC todel
  333.   iep.code := $41
  334.   iep.qualifier := $ffff8000
  335.   DoIO(io_req)
  336. ENDWHILE
  337. WHILE Char(bb+bbp+i)
  338.   MapANSI(bb+bbp+i,1,raw_char,1,NIL)
  339.   iep.code:=raw_char.cd
  340.   iep.qualifier:=raw_char.qu
  341.   DoIO(io_req)
  342.   INC i
  343. ENDWHILE
  344. ENDPROC
  345.  
  346.